#include <cstring>
#include <cctype>
#include <gl/gl.h>

#include "VectorText.hpp"

VECTORTEXT::VECTORTEXT() {
};

VECTORTEXT::~VECTORTEXT() {
};

	// Write EXIT at the exit end.

void VECTORTEXT::Draw(POSITION Pos, float letter_size, char *text) {
	glPushMatrix();
	Pos.Translate();

	float offset = ((strlen(text) * letter_size * 3) - letter_size) / 2;
	int c,l,p,t;
  glLineWidth(1);

  int LETTERS[26][33] = {
  	{ 4, 0,0,0,4, 0,4,2,4, 2,4,2,0, 0,2,2,2, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0 }, // A
  	{ 8, 0,0,0,4, 0,4,1,4, 0,2,1,2, 0,0,1,0, 1,4,2,3, 1,2,2,3, 1,2,2,1, 1,0,2,1 }, // B
  	{ 5, 2,3,1,4, 1,4,0,3, 0,3,0,1, 0,1,1,0, 1,0,2,1, 0,0,0,0, 0,0,0,0, 0,0,0,0 }, // C
  	{ 6, 0,0,1,0, 1,0,2,1, 2,1,2,3, 2,3,1,4, 1,4,0,4, 0,4,0,0, 0,0,0,0, 0,0,0,0 }, // D
  	{ 4, 0,0,2,0, 0,2,2,2, 0,4,2,4, 0,0,0,4, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0 }, // E
  	{ 3, 0,2,2,2, 0,4,2,4, 0,0,0,4, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0 }, // F
  	{ 7, 2,3,1,4, 1,4,0,3, 0,3,0,1, 0,1,1,0, 1,0,2,1, 2,1,2,2, 2,2,1,2, 0,0,0,0 }, // G
  	{ 3, 0,0,0,4, 2,0,2,4, 0,2,2,2, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0 }, // H
  	{ 3, 0,0,2,0, 0,4,2,4, 1,0,1,4, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0 }, // I
  	{ 5, 0,2,0,1, 0,1,1,0, 1,0,2,1, 2,1,2,4, 2,4,0,4, 0,0,0,0, 0,0,0,0, 0,0,0,0 }, // J
  	{ 3, 0,0,0,4, 0,2,2,0, 0,2,2,4, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0 }, // K
  	{ 2, 0,0,2,0, 0,0,0,4, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0 }, // L
  	{ 4, 0,0,0,4, 0,4,1,1, 1,1,2,4, 2,4,2,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0 }, // M
  	{ 3, 0,0,0,4, 0,4,2,0, 2,0,2,4, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0 }, // N
  	{ 6, 1,0,2,1, 2,1,2,3, 2,3,1,4, 1,4,0,3, 0,3,0,1, 0,1,1,0, 0,0,0,0, 0,0,0,0 }, // O
  	{ 5, 0,0,0,4, 0,4,1,4, 1,4,2,3, 2,3,1,2, 1,2,0,2, 0,0,0,0, 0,0,0,0, 0,0,0,0 }, // P
  	{ 7, 1,0,2,1, 2,1,2,3, 2,3,1,4, 1,4,0,3, 0,3,0,1, 0,1,1,0, 1,1,2,0, 0,0,0,0 }, // Q
  	{ 6, 0,0,0,4, 0,4,1,4, 1,4,2,3, 2,3,1,2, 1,2,0,2, 1,2,2,0, 0,0,0,0, 0,0,0,0 }, // R
  	{ 5, 2,3,1,4, 1,4,0,3, 0,3,2,1, 0,1,1,0, 1,0,2,1, 0,0,0,0, 0,0,0,0, 0,0,0,0 }, // S
  	{ 2, 0,4,2,4, 1,0,1,4, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0 }, // T
  	{ 4, 0,4,0,1, 0,1,1,0, 1,0,2,1, 2,4,2,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0 }, // U
  	{ 2, 0,4,1,0, 1,0,2,4, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0 }, // V
  	{ 4, 0,4,0,0, 0,0,1,2, 1,2,2,0, 2,0,2,4, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0 }, // W
  	{ 2, 0,0,2,4, 0,4,2,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0 }, // X
  	{ 3, 0,4,1,2, 1,2,2,4, 1,2,1,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0 }, // Y
  	{ 3, 0,4,2,4, 2,4,0,0, 0,0,2,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0 }, // Z
  };

  int NUM_LETTERS[10][33] = {
  	{ 6, 1,0,2,1, 2,1,2,3, 2,3,1,4, 1,4,0,3, 0,3,0,1, 0,1,1,0, 0,0,0,0, 0,0,0,0 }, // O
  	{ 3, 0,0,2,0, 1,0,1,4, 1,4,0,3, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0 }, // 1
  	{ 4, 0,3,1,4, 1,4,2,3, 2,3,0,0, 0,0,2,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0 }, // 2
  	{ 6, 0,3,1,4, 1,4,2,3, 2,3,1,2, 1,2,2,1, 2,1,1,0, 1,0,0,1, 0,0,0,0, 0,0,0,0 }, // 3
  	{ 3, 0,4,0,2, 0,2,2,2, 2,4,2,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0 }, // 4
  	{ 6, 0,0,1,0, 1,0,2,1, 2,1,1,2, 1,2,0,2, 0,2,0,4, 0,4,2,4, 0,0,0,0, 0,0,0,0 }, // 5
  	{ 8, 0,2,1,3, 1,3,2,2, 2,2,2,1, 2,1,1,0, 1,0,0,1, 0,1,0,3, 0,3,1,4, 1,4,2,3 }, // 6
  	{ 3, 0,3,0,4, 0,4,2,4, 2,4,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0 }, // 7
  	{ 6, 1,0,2,1, 2,1,0,3, 0,3,1,4, 1,4,2,3, 2,3,0,1, 0,1,1,0, 0,0,0,0, 0,0,0,0 }, // 8
  	{ 8, 2,2,1,1, 1,1,0,2, 0,2,0,3, 0,3,1,4, 1,4,2,3, 2,3,2,1, 2,1,1,0, 1,0,0,1 }, // 9
  };

  int SPEC_LETTERS[9][33] = {
  	{ 4, 0,0,0,1, 0,1,1,1, 1,1,1,0, 1,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0 }, // .
  	{ 3, 0,0,1,0, 1,0,1,1, 1,1,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0 }, // ,
  	{ 8, 2,3,1,2, 1,2,2,2, 2,2,2,4, 2,4,1,4, 1,4,0,3, 0,3,0,1, 0,1,1,0, 1,0,2,1 }, // @
  	{ 3, 2,4,1,3, 1,3,1,1, 1,1,2,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0 }, // (
  	{ 3, 0,0,1,1, 1,1,1,3, 1,3,0,4, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0 }, // )
  	{ 8, 0,0,0,1, 0,1,1,1, 1,1,1,0, 1,0,0,0, 0,4,1,4, 1,4,1,3, 1,3,0,3, 0,3,0,4 }, // :
  	{ 1, 0,0,2,4, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0 }, // /
  	{ 1, 0,2,2,2, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0 }, // -
  	{ 2, 0,2,2,2, 1,1,1,3, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0 }, // +
  };

  glBegin(GL_LINES);
	for (t=0, p=0; t<strlen(text); t++, p++) {
		c = (int)(tolower(text[t])) - (int)('a');
		if ((c>=0) && (c<26)) {
			for (l=1; l<(LETTERS[c][0])*4; l+=4) {
				glVertex3f(0,letter_size*LETTERS[c][l+1],letter_size*LETTERS[c][l+0]+p*letter_size*3-offset);
				glVertex3f(0,letter_size*LETTERS[c][l+3],letter_size*LETTERS[c][l+2]+p*letter_size*3-offset);
			}
		} else if ((tolower(text[t])=='0') || ((tolower(text[t])<='9') && (tolower(text[t])>='1'))) {
			c = 1 + (int)(tolower(text[t])) - (int)('1');
			if (tolower(text[t])=='0') c=0;
			for (l=1; l<(NUM_LETTERS[c][0])*4; l+=4) {
				glVertex3f(0,letter_size*NUM_LETTERS[c][l+1],letter_size*NUM_LETTERS[c][l+0]+p*letter_size*3-offset);
				glVertex3f(0,letter_size*NUM_LETTERS[c][l+3],letter_size*NUM_LETTERS[c][l+2]+p*letter_size*3-offset);
			}
		} else {
			if (tolower(text[t])=='.') c=0;
			if (tolower(text[t])==',') c=1;
			if (tolower(text[t])=='@') c=2;
			if (tolower(text[t])=='(') c=3;
			if (tolower(text[t])==')') c=4;
			if (tolower(text[t])==':') c=5;
			if (tolower(text[t])=='/') c=6;
			if (tolower(text[t])=='-') c=7;
			if (tolower(text[t])=='+') c=8;
			if ((c>=0) && (c<9)) {
				for (l=1; l<(SPEC_LETTERS[c][0])*4; l+=4) {
					glVertex3f(0,letter_size*SPEC_LETTERS[c][l+1],letter_size*SPEC_LETTERS[c][l+0]+p*letter_size*3-offset);
					glVertex3f(0,letter_size*SPEC_LETTERS[c][l+3],letter_size*SPEC_LETTERS[c][l+2]+p*letter_size*3-offset);
				}
			}
		}
	}
	glEnd();

	glPopMatrix();
};

